home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************/
- /* DATABOSS MODULE: DB_MEMO.C */
- /****************************************************************************/
-
- #include "db_lsc.h"
-
- #ifdef __TURBOC__
- #include <conio.h>
- #else
- #include <graph.h>
- #endif
- #include <stdio.h>
- #include <string.h>
- #include "db_types.h"
- #include "db_conio.h"
- #include "db_curs.h"
- #include "db_file.h"
- #include "db_funcs.h"
- #include "db_key.h"
- #include "db_math.h"
- #include "db_sets.h"
- #include "db_str.h"
- #include "db_tree.h"
- #include "db_win.h"
- #include "db_util.h"
- #include "db_memo.h"
-
- /**************************** GLOBAL VARIABLES ****************************/
-
- bool editmode;
- long memorecstat;
-
- /*************************** INTERNAL CONSTANTS ***************************/
-
- #define Msge1 "Warning!!"
- #define Msge2 "File is Locked. You MUST wait until it becomes available"
-
- /*************************** INTERNAL VARIABLES ***************************/
-
- static word memosize;
- static int blockpos;
- static byte ml,ms;
- static winptr markw;
- static byte x,y,a;
- static winptr w;
-
- static bool initialized = False;
-
- /***************************** IMPLEMENTATION *****************************/
-
- void secure_rec0(datafile *f, byte lck)
- {
- int tv;
-
- if (multiuser) {
- do {
- tv = lock_datf(f,0L,lck);
- if (tv == -1)
- dspmsge(LSC_Warning, LSC_StatusRecLocked,4.0);
- } while (tv != 0);
- }
- }
-
- void dspm(byte x, byte y, byte atr, byte sno,
- word recsize,
- fldptr fld,
- datafile *dataf,
- winptr w)
- {
- long mrecno;
- int i;
- word bs;
- byte ml,ms;
- genbuf tbuf;
- uchar mbuf[membufsiz+1];
- string pic,ts;
-
- memset(&mbuf[1],' ',membufsiz);
- memmove(&mrecno,fld->faddr,4);
- strcpy(pic,fld->pic);
-
- i = strposch(Pic_Star,pic) + 1;
- ml = (byte) ival(strcopy(ts,pic,i,strlen(pic)-i+2));
-
- strcopy(pic,pic,0,i-1);
- strcat(pic,chstr(ts,Pic_X));
- expand(pic,pic);
- ms = (byte) strlen(pic);
- bs = recsize - 8;
-
- if (atr == 0) atr = attrib;
- else {
- if (atr == 255) atr = 0;
- }
-
- i = 0;
- while ((mrecno != 0) && ((i*bs) < (ml*ms))) {
- getrec(dataf,mrecno,&tbuf[1]);
- memmove(&mrecno,&tbuf[bs+5],4);
- memmove(&mbuf[1+i*bs],&tbuf[5],bs);
- i++;
- }
-
- ts[ms] = '\0';
- i = 0;
- do {
- memmove(ts,&mbuf[i*ms+1],ms);
- writewxy(ts,atr,x,(byte)(y+i),w);
- i++;
- } while (i < ml);
- }
-
- bool chkblk(word sz, uchar *tbuf)
- {
- word i;
-
- i = 1;
- while ((tbuf[i] == ' ') && (i <= sz)) i++;
- return ((bool) (i > sz));
- }
-
- void drawbar(byte line)
- {
- if (markw != NULL) {
- writewxy("∞",_iv,1,(byte) blockpos,markw);
- blockpos = (int) fround((double) (((line + ml) * ml)/(memosize/ms)));
- if (blockpos < 1) blockpos = 1;
- if ((blockpos == 1) && (line != 1)) blockpos = 2;
- else {
- if (line == 1) blockpos = 1;
- else {
- if ((blockpos == ml) && (((word) ((line+ml)*ms)) <= memosize)) blockpos = ml-1;
- else {
- if (((word) ((line+ml)*ms)) > memosize) blockpos = ml;
- }
- }
- }
- writewxy("€",15,1,(byte) blockpos,markw);
- }
- }
-
- void dispblk(byte line, uchar *mbuf)
- {
- string ts;
- int i,j;
-
- ts[ms] = '\0';
- i = line - 1;
- j = 0;
- do {
- memmove(ts,&mbuf[i*ms+1],ms);
- writewxy(ts,a,x,(byte)(y+j),w);
- i++;
- j++;
- } while (j < ml);
- drawbar(line);
- }
-
- void scroll(int posptr, word msize, byte bwid,
- byte *line, bool *redisp, uchar *mbuf)
- {
- if (posptr > (msize + ((*line - 1) * bwid))) {
- (*line)++;
- dispblk(*line,mbuf);
- *redisp = False;
- }
- else {
- if (posptr <= ((*line - 1) * bwid)) {
- (*line)--;
- dispblk(*line,mbuf);
- *redisp = False;
- }
- }
- }
-
- void blkedit( byte px, byte py, byte bwid, word msize, word bsize,
- byte *sx, byte *sy, winptr winp, uchar *mbuf)
- {
- uchar ukey;
- byte b,line;
- int posptr,lpos,moveblock,movepos,splitpos,z;
- bool qit,redisp;
- string ts;
- cursortyp tcurs;
-
- tcurs = winp->curs;
- line = 1;
- splitpos = 0;
- lpos = 0;
- ukey = ' ';
- qit = False;
- redisp = False;
- posptr = *sx + (*sy-1)*bwid;
- ins_flag = (bool) (!ins_flag);
- toggleins(&winp->curs);
- set_del(ExitSet,Enter,UArr,DArr,PgUp,PgDn,CtrlEnd,CtrlHome,0);
- do {
- if (redisp) {
- writewxy(chstr(ts,mbuf[lpos]),a,(byte)(px+*sx-1),(byte)(py+*sy-1),NULL);
- if ((splitpos != 0) || (ins_flag) || ((ukey == Del) || (ukey == BackSp))) dispblk(line,mbuf);
- splitpos = 0;
- redisp = False;
- }
-
- lpos = posptr;
- *sy = (byte) (((posptr-1)/bwid)+1-(line-1));
- *sx = (byte) (posptr % bwid);
- if (*sx == 0) *sx = bwid;
- gotoxy(px+*sx-1,py+*sy-1);
- if (ukey == BackSp) writewxy(chstr(ts,mbuf[lpos]),a,(byte)(px+*sx-1),(byte)(py+*sy-1),NULL);
- ukey = getkey();
- if ((_xkey && (set_member(ExitSet,ukey))) ||
- ((ukey == QitKey) || (ukey == CtrlPgUp) || (ukey == CtrlPgDn))) {
- exitcode = ukey;
- qit = True;
- /************************************************************************
- * [DG] 09/10/92 -- remapped CtrlEnter to F10, Tab to CtrlPgDn, and *
- * STab to CtrlPgUp. *
- ************************************************************************/
- switch (ukey) {
- case CtrlEnter : exitcode = F10; _xkey = True; break;
- case Tab : exitcode = CtrlPgDn; break;
- case STab : exitcode = CtrlPgUp; break;
- }
- /*********************/ /* [DG] End Modification */ /*******************/
- }
- else {
- if (_xkey || (ukey < ' ')) {
- switch (ukey) {
- case CtrlEnd :
- posptr = bsize - bwid + 1;
- line = (byte) ((bsize/ms) - ml + 1);
- dispblk(line,mbuf);
- break;
- case CtrlHome :
- posptr = 1;
- line = 1;
- dispblk(line,mbuf);
- break;
- case Ins : toggleins(&winp->curs); break;
- case LArr :
- if (posptr > 1) {
- posptr--;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case RArr :
- if (posptr < bsize) {
- posptr++;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case UArr :
- if ((int) (posptr-bwid) >= 1) {
- posptr -= bwid;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case DArr :
- if ((posptr+bwid) <= bsize) {
- posptr += bwid;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case PgUp :
- for (b = 1; b <= ml-1; b++) {
- if ((int) (posptr-bwid) >= 1) {
- posptr -= bwid;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- break;
- case PgDn :
- for (b = 1; b <= ml-1; b++) {
- if ((posptr+bwid) <= bsize) {
- posptr += bwid;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- break;
- case Home :
- posptr = posptr - *sx + 1;
- *sx = 1;
- break;
- case EndKey :
- posptr += (bwid - *sx);
- z = posptr;
- b = *sx;
- *sx = bwid;
- while ((mbuf[posptr] == ' ') && (*sx > 1)) {
- (*sx)--;
- posptr--;
- }
- if ((*sx < bwid) && (mbuf[posptr] != ' ')) {
- (*sx)++;
- posptr++;
- }
- if (*sx == b) {
- *sx = bwid;
- posptr = z;
- }
- break;
- case CtrlRArr :
- if (posptr < bsize) {
- if (set_member(_WORDSET,mbuf[posptr])) {
- do {
- posptr++;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- } while ((set_member(_WORDSET,mbuf[posptr])) && (posptr != bsize));
- }
- while ((!set_member(_WORDSET,mbuf[posptr])) && (posptr < bsize)) {
- posptr++;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- break;
- case CtrlLArr :
- if (posptr > 1) {
- if (!set_member(_WORDSET,mbuf[posptr-1])) {
- do {
- posptr--;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- } while ((!set_member(_WORDSET,mbuf[posptr])) && (posptr != 1));
- }
- while ((set_member(_WORDSET,mbuf[posptr-1])) && (posptr > 1)) {
- posptr--;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- break;
- case ClrKey :
- for (b = *sx; b <= bwid; b++)
- mbuf[posptr+b-*sx] = ' ';
- dispblk(line,mbuf);
- break;
- /***********************************************************************
- *[DG] 09/10/92 -- Commented out the Tab and STab edit handlers, so *
- * these keys can be used to exit the memo field. *
- ***********************************************************************/
- /*
- case Tab :
- b = (byte) _Tab_Space;
- while ((b > 0) && (posptr < bsize)) {
- b--;
- posptr++;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case STab :
- b = (byte) _Tab_Space;
- while ((b > 0) && (posptr > 1)) {
- b--;
- posptr--;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- ********************/ /* [DG] End Modifications */ /*******************/
- case Enter :
- if ((posptr+bwid) <= bsize) {
- if (ins_flag) {
- redisp = True;
- if ((posptr+bwid+bwid) < bsize) {
- memmove(&mbuf[posptr+(bwid-*sx+1)+bwid],
- &mbuf[posptr+(bwid-*sx+1)],
- bsize-bwid-(posptr+(bwid-*sx)));
- memset(&mbuf[posptr+(bwid-*sx+1)],' ',bwid);
- }
- memmove(&mbuf[posptr+(bwid-*sx+1)],&mbuf[posptr],bwid-*sx+1);
- memset(&mbuf[posptr],' ',bwid-*sx+1);
- }
- posptr += (bwid-*sx+1);
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- break;
- case Del :
- redisp = True;
- memmove(ts,&mbuf[posptr],bwid-*sx+1);
- ts[bwid-*sx+1] = '\0';
- strip(ts,ts);
- if (ts[0] != '\0') {
- memmove(&mbuf[posptr],&mbuf[posptr+1],bwid-*sx);
- mbuf[posptr+(bwid-*sx)] = ' ';
- }
- else {
- if (posptr + bwid < bsize) {
- moveblock = bwid - *sx + 1;
- if (moveblock != bwid) {
- while ((mbuf[posptr+(bwid-*sx)+moveblock] != ' ') && (moveblock > 0))
- moveblock--;
- }
- if (moveblock > 0) {
- memmove(&mbuf[posptr],&mbuf[posptr+(bwid-*sx+1)],bwid);
- memset(&mbuf[posptr+bwid],' ',moveblock);
- memmove(ts,&mbuf[posptr+(bwid-*sx+1)],bwid);
- ts[bwid] = '\0';
- strip(ts,ts);
- if ((ts[0] == '\0') && ((posptr+2*bwid) < bsize)) {
- memmove(&mbuf[posptr + (bwid-*sx+1)],&mbuf[posptr+(bwid-*sx+1)+bwid],
- bsize-bwid-(posptr+(bwid-*sx)));
- memset(&mbuf[bsize-bwid+1],' ',bwid);
- }
- }
- }
- }
- break;
- case BackSp :
- if (posptr > 1) {
- redisp = True;
- posptr--;
- if (*sx > 1) {
- memmove(&mbuf[posptr],&mbuf[posptr+1],bwid-*sx+1);
- mbuf[posptr+(bwid-*sx+1)] = ' ';
- }
- else {
- movepos = 0;
- while ((mbuf[posptr-movepos] == ' ') && (movepos < bwid))
- movepos++;
- moveblock = movepos;
- while ((mbuf[posptr+moveblock] != ' ') && (moveblock > 0))
- moveblock--;
- if (moveblock > 0) {
- memmove(&mbuf[posptr-movepos+1],&mbuf[posptr+1],moveblock);
- memmove(&mbuf[posptr+1],&mbuf[posptr+moveblock+1],bwid-moveblock);
- memset(&mbuf[posptr+bwid-moveblock+1],' ',moveblock);
- memmove(ts,&mbuf[posptr + 1],bwid);
- ts[bwid] = '\0';
- strip(ts,ts);
- if ((ts[0] == '\0') && (posptr+2*bwid < bsize)) {
- memmove(&mbuf[posptr+1],&mbuf[posptr+1+bwid],bsize-bwid-posptr);
- memset(&mbuf[bsize-bwid+1],' ',bwid);
- }
- posptr = posptr - movepos + 1;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- }
- break;
- }
- }
- else {
- redisp = True;
- if ((*sx == bwid) && (posptr != bsize) && (ukey != ' ')) {
- memmove(&mbuf[posptr+bwid+1],&mbuf[posptr+1],bsize-bwid-posptr);
- memset(&mbuf[posptr+1],' ',bwid);
- splitpos = posptr - 1;
- while ((mbuf[splitpos] != ' ') && (mbuf[splitpos] != '-') &&
- (posptr - splitpos < bwid-1))
- splitpos--;
- if ((mbuf[splitpos] == ' ') || (mbuf[splitpos] == '-')) {
- mbuf[posptr] = ukey;
- memmove(&mbuf[posptr+1],&mbuf[splitpos+1],posptr-splitpos);
- memset(&mbuf[splitpos+1],' ',posptr-splitpos);
- posptr += (posptr-splitpos);
- }
- else {
- splitpos = 0;
- if (ins_flag) memmove(&mbuf[posptr+1],&mbuf[posptr],bsize-posptr);
- mbuf[posptr] = ukey;
- }
- }
- else {
- if (ins_flag) {
- if ((mbuf[posptr+(bwid-*sx)] != ' ') && (posptr + bwid < bsize)) {
- if (posptr + bwid + bwid < bsize)
- memmove(&mbuf[posptr+(bwid-*sx+1)+bwid],&mbuf[posptr+(bwid-*sx+1)],
- bsize-bwid-(posptr+(bwid-*sx)));
- memset(&mbuf[posptr+(bwid-*sx+1)],' ',bwid);
- memmove(&mbuf[posptr+(bwid-*sx+1)],&mbuf[posptr],bwid-*sx+1);
- memset(&mbuf[posptr],' ',bwid-*sx+1);
- }
- else
- memmove(&mbuf[posptr+1],&mbuf[posptr],bwid-*sx);
- }
- mbuf[posptr] = ukey;
- }
- if (posptr < bsize) posptr++;
- scroll(posptr,msize,bwid,&line,&redisp,mbuf);
- }
- }
- } while (!qit);
- set_add(ExitSet,Enter,UArr,DArr,PgUp,PgDn,0);
- winp->curs = tcurs;
- }
-
- void editmemo(byte _x, byte _y, byte atr,
- word recsize,
- fldtyp *fld,
- ptr buf,
- winptr _w, winptr h,
- datafile *dataf,
- long *recnum)
- {
- uchar tbuf[DB_mxdrs+1],mbuf[membufsiz+1];
- string pic,ts;
- int i;
- word bs,fillpos,memrecsiz,nummemrecs;
- long mrecno,srec,trec,nextmemrec;
- cursortyp tcurs;
- byte sx,sy;
- bool dataok,blockempty;
-
- x = _x;
- y = _y;
- w = _w;
- memset(&mbuf[1],' ',membufsiz);
- strcpy(pic,fld->pic);
- i = strposch(Pic_Star,pic) + 1;
- ml = (byte) ival(strcopy(ts,pic,i,strlen(pic)-i+2));
- strcopy(pic,pic,0,i-1);
- strcat(pic,chstr(ts,Pic_X));
- expand(pic,pic);
- ms = (byte) strlen(pic);
- memosize = membufsiz - (membufsiz % ms);
- bs = recsize - 8;
- i = 0;
- memmove(&mrecno,fld->faddr,4);
- srec = mrecno;
- while (mrecno != 0) {
- getrec(dataf,mrecno,&tbuf[1]);
- memmove(&mrecno,&tbuf[bs+5],4);
- fillpos = 1 + (i * bs);
- if ((fillpos + bs) > memosize)
- memmove(&mbuf[fillpos],&tbuf[5],memosize - (i*bs));
- else
- memmove(&mbuf[fillpos],&tbuf[5],bs);
- i++;
- }
- a = _ev;
- blockpos = 1;
- if (openwin(0,x+w->mx-1+ms,y+w->my-1,1,ml,_iv,_iv,0,"\0 ",TopCnt,"")) {
- markw = curwin;
- markw->disp = True;
- initblk(markw->mwid * markw->mhgt,'∞',markw->wincolr,markw->winblk);
- dispwindow(markw);
- }
-
- dispblk(1,mbuf);
- sx = 1;
- sy = 1;
- curfun(_GetCurs,&tcurs);
- do {
- blkedit((byte)(x+w->mx-1),(byte)(y+w->my-1),ms,ms*ml,memosize,&sx,&sy,w,mbuf);
- if (exitcode == HlpKey) disphelp(h);
- } while (exitcode == HlpKey);
-
- if (markw != NULL) closewin(&markw);
- curfun(_SetCTyp,&tcurs);
- if (atr == 0) a = attrib;
- else a = (byte) ((atr == 255) ? 0 : atr);
- dispblk(1,mbuf);
- if (exitcode != QitKey) {
- _upward = (bool) (exitcode == CtrlPgUp);
- memrecsiz = bs;
- nummemrecs = memosize/bs;
- if ((memosize % bs) != 0) {
- nummemrecs++;
- memrecsiz = memosize % bs;
- }
- dataok = False;
- nextmemrec = 0;
- if (srec == 0) {
- memset(&tbuf[1],' ',recsize);
- while (nummemrecs > 0) {
- memmove(&tbuf[5],&mbuf[1+(nummemrecs-1)*bs],memrecsiz);
- blockempty = chkblk(memrecsiz+4,tbuf);
- if (memrecsiz < bs)
- memrecsiz = bs;
- if (dataok || (!blockempty)) {
- dataok = True;
- memmove(&tbuf[1],&memorecstat,4);
- memmove(&tbuf[bs+5],&nextmemrec,4);
- secure_rec0(dataf,Lock);
- addrec(dataf,&nextmemrec,&tbuf[1]);
- secure_rec0(dataf,UnLock);
- memset(&tbuf[1],' ',recsize);
- }
- nummemrecs--;
- }
- memmove(fld->faddr,&nextmemrec,4);
- }
- else {
- getrec(dataf,srec,&tbuf[1]);
- memmove(&trec,&tbuf[bs+5],4);
- memset(&tbuf[1],' ',recsize);
- while (nummemrecs > 0) {
- memmove(&tbuf[5],&mbuf[1+(nummemrecs-1)*bs],memrecsiz);
- blockempty = chkblk(memrecsiz+4,tbuf);
- if (memrecsiz < bs)
- memrecsiz = bs;
- if (dataok || (!blockempty)) {
- dataok = True;
- memmove(&tbuf[1],&memorecstat,4);
- memmove(&tbuf[bs+5],&nextmemrec,4);
- if (srec != 0) {
- putrec(dataf,srec,&tbuf[1]);
- nextmemrec = srec;
- srec = trec;
- if (srec != 0) {
- getrec(dataf,srec,&tbuf[1]);
- memmove(&trec,&tbuf[bs+5],4);
- }
- }
- else {
- secure_rec0(dataf,Lock);
- addrec(dataf,&nextmemrec,&tbuf[1]);
- secure_rec0(dataf,UnLock);
- }
- memset(&tbuf[1],' ',recsize);
- }
- nummemrecs--;
- }
- if (editmode) {
- memmove(&tbuf[1],buf,recsize);
- getrec(dataf,*recnum,buf);
- memmove(fld->faddr,&nextmemrec,4);
- putrec(dataf,*recnum,buf);
- memmove(buf,&tbuf[1],recsize);
- }
- memmove(fld->faddr,&nextmemrec,4);
- while (srec != 0) {
- deleterec(dataf,srec);
- srec = trec;
- if (srec != 0) {
- getrec(dataf,srec,&tbuf[1]);
- memmove(&trec,&tbuf[bs+5],4);
- }
- }
- }
- }
- }
-
- /********************** UNIT INITIALIZATION/EXIT CODE *********************/
-
- void db_memo_init(void)
- {
- if (!initialized) {
- initialized = True;
- db_funcs_init();
- db_key_init();
- db_tree_init();
- db_util_init();
- db_win_init();
- memorecstat = -2;
- editmode = False;
- }
- }
-
- /**************************** END OF DB_MEMO.C ****************************/
-